package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.ItemSelectEvent;
import org.primefaces.model.chart.BarChartSeries;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.LineChartSeries;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaCliente;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteBean;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteListaRes;
import com.sisgesbyte.services.administracion.bean.ZonaBean;
import com.sisgesbyte.services.proyeccion.ProyeccionCategoriaClienteService;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyCategoriaClienteResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyCategoriaClienteBean;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.MantenimientoZona;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;
import com.sisgesbyte.services.ventas.bean.ZonaListaResponse;

@ManagedBean
@ViewScoped
public class ProyeccionCategoriaClienteMBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@EJB
	private ProyeccionCategoriaClienteService proyeccionCategoriaClienteService;
	@EJB
	private MantenimientoZona mantenimientoZona;
	@EJB
	private MantenimientoCategoriaCliente mantenimientoCategoriaCliente;
	private List<CategoriaClienteBean> listaCanales;
	private List<PeriodoBean> listaPeriodos;
	private List<ZonaBean> listaZonas;
	private int idZona;
	private int idCanal;
	private Integer periodoDefault;
	private CartesianChartModel combinedModelGeneral;
	private CartesianChartModel combinedModelPeriodo;
	private List<ProyCategoriaClienteBean> listaProyeccion;
	private String colorGeneral;
	private String colorPeriodo;
	private Integer maxMontoGeneral = 0;
	private Integer maxMontoPeriodo = 0;
	private boolean mostrarBar;
	private ProyCategoriaClienteBean selected;
	
	@PostConstruct
	public void init() {
		colorGeneral="";
		mostrarBar=false;
		setIdZona(0);
		cargarPeriodos();
		cargarZonas();
		mostrarPeriodoDefault();
		cargarCanales();
		inicializar();
	}

	public void inicializar() {
		try {
			selected = new ProyCategoriaClienteBean();
			AvanceProyCategoriaClienteResponse avance = proyeccionCategoriaClienteService.listaAvanceCategoriaCliente(ObtenerIdTransaccion(),idZona, periodoDefault,idCanal);
			this.listaProyeccion = avance.getListaProyeccionCategoriaClientes();
				if(avance.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
					construirBarras();	
					setMostrarBar(true);
				}else{
					System.out.println("Ingresaa");
					setMostrarBar(false);
				}
						
		} catch (Exception e) {
			System.out.println("Error al cargar Proyecciones: " + e);
			setMostrarBar(false);
		}
	}

	public void cargarPeriodos() {
		try {
			PeriodoListaBean periodos = mantenimientoPeriodo
					.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos = periodos.getListaPeriodos();
		} catch (Exception e) {
			System.out.println("Error al cargar los periodos: " + e);
		}
	}

	public void mostrarPeriodoDefault() {
		for (PeriodoBean ls : getListaPeriodos()) {
			if (ls.getDefecto() != null && ls.getDefecto() == true) {
				setPeriodoDefault(ls.getId());
			}
		}
	}
	public void cargarCanales(){
		try{
			FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			 CategoriaClienteListaRes canales = mantenimientoCategoriaCliente.listaCategoriaCliente(ObtenerIdTransaccion(), filtro);
			if(canales.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaCanales =canales.getListaCategoriaCliente();
			}
			
		}catch(Exception e){
			System.out.println("Error al obtener los canales: " + e);
		}
	}
	public void itemSelect(ItemSelectEvent event) {
		setSelected(listaProyeccion.get(event.getItemIndex()));
		
	}
	public void cargarZonas(){
		try{
			FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			ZonaListaResponse zonas = mantenimientoZona.listaZonas(ObtenerIdTransaccion(), filtro);
			if(zonas.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaZonas =zonas.getListaZonas();
			}
			
		}catch(Exception e){
			System.out.println("Error al obtener las zonas: " + e);
		}
	}
	
	public void construirBarras(){
		List<Integer> listaProyGeneral = new ArrayList<Integer>();
		List<Integer> listaProyPeriodo = new ArrayList<Integer>();
		
		combinedModelGeneral = new CartesianChartModel();
		combinedModelPeriodo = new CartesianChartModel();
		
		BarChartSeries catGeneral = new BarChartSeries();
		BarChartSeries catPeriodo = new BarChartSeries();
		catGeneral.setLabel("Canales");
		catPeriodo.setLabel("Canales");
		
	 	LineChartSeries proyeccionGeneral = new LineChartSeries();
        LineChartSeries proyeccionPeriodo = new LineChartSeries();
        proyeccionGeneral.setLabel("Proyeccion");
        proyeccionPeriodo.setLabel("Proyeccion");
		
		StringBuilder jpqlGeneral = new StringBuilder();
		StringBuilder jpqlPeriodo = new StringBuilder();
		
		for(ProyCategoriaClienteBean ls : listaProyeccion){
			//agregamos parametros de avance
			catGeneral.set(ls.getCategoriaCliente(), ls.getAvanceMontoGeneral());
			catPeriodo.set(ls.getCategoriaCliente(), ls.getAvanceMontoPeriodo());
			//capturamos los colores
			jpqlGeneral.append(ls.getColorBandaGeneral());
			jpqlGeneral.append(",");
			jpqlPeriodo.append(ls.getColorBandaPeriodo());
			jpqlPeriodo.append(",");
			//capturamos las proyecciones
        	listaProyGeneral.add(Integer.valueOf((ls.getProyeccionMontoGeneral().setScale(2, BigDecimal.ROUND_HALF_UP)).intValue()));
        	listaProyPeriodo.add(Integer.valueOf((ls.getProyeccionMontoPeriodo().setScale(2, BigDecimal.ROUND_HALF_UP)).intValue()));
        	//agregamos parametros de proyeccion
        	proyeccionGeneral.set(ls.getCategoriaCliente(), ls.getProyeccionMontoGeneral());
        	proyeccionPeriodo.set(ls.getCategoriaCliente(), ls.getProyeccionMontoPeriodo());
		}
		
		setColorGeneral(jpqlGeneral.substring(0, jpqlGeneral.length()-1));
		setColorPeriodo(jpqlPeriodo.substring(0, jpqlPeriodo.length()-1));
		
		 //ordenamos la lista de menor a mayor
        Collections.sort(listaProyGeneral);
        Collections.sort(listaProyPeriodo);
        int porcentaje = Integer.valueOf(listaProyGeneral.get(listaProyGeneral.size()-1))*10/100;
        int porcentajePeriodo = Integer.valueOf(listaProyPeriodo.get(listaProyPeriodo.size()-1))*10/100;
        setMaxMontoGeneral(listaProyGeneral.get(listaProyGeneral.size()-1) + porcentaje);
        setMaxMontoPeriodo(listaProyPeriodo.get(listaProyPeriodo.size()-1) + porcentajePeriodo);
       
        combinedModelGeneral.addSeries(catGeneral);
        combinedModelGeneral.addSeries(proyeccionGeneral);
		
		combinedModelPeriodo.addSeries(catPeriodo);
		combinedModelPeriodo.addSeries(proyeccionPeriodo);


	}
	
	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try {
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext()
					.getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		} catch (Exception e) {
			sessionId = "Error";
			System.out.println("Error al obtener Session" + e);
		}
		return sessionId;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public Integer getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(Integer periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public CartesianChartModel getCombinedModelGeneral() {
		return combinedModelGeneral;
	}

	public void setCombinedModelGeneral(CartesianChartModel combinedModelGeneral) {
		this.combinedModelGeneral = combinedModelGeneral;
	}

	public CartesianChartModel getCombinedModelPeriodo() {
		return combinedModelPeriodo;
	}

	public void setCombinedModelPeriodo(CartesianChartModel combinedModelPeriodo) {
		this.combinedModelPeriodo = combinedModelPeriodo;
	}

	public List<ProyCategoriaClienteBean> getListaProyeccion() {
		return listaProyeccion;
	}

	public void setListaProyeccion(List<ProyCategoriaClienteBean> listaProyeccion) {
		this.listaProyeccion = listaProyeccion;
	}

	public String getColorGeneral() {
		return colorGeneral;
	}

	public void setColorGeneral(String colorGeneral) {
		this.colorGeneral = colorGeneral;
	}

	public String getColorPeriodo() {
		return colorPeriodo;
	}

	public void setColorPeriodo(String colorPeriodo) {
		this.colorPeriodo = colorPeriodo;
	}

	public Integer getMaxMontoGeneral() {
		return maxMontoGeneral;
	}

	public void setMaxMontoGeneral(Integer maxMontoGeneral) {
		this.maxMontoGeneral = maxMontoGeneral;
	}

	public Integer getMaxMontoPeriodo() {
		return maxMontoPeriodo;
	}

	public void setMaxMontoPeriodo(Integer maxMontoPeriodo) {
		this.maxMontoPeriodo = maxMontoPeriodo;
	}

	public List<ZonaBean> getListaZonas() {
		return listaZonas;
	}

	public void setListaZonas(List<ZonaBean> listaZonas) {
		this.listaZonas = listaZonas;
	}

	public int getIdZona() {
		return idZona;
	}

	public void setIdZona(int idZona) {
		this.idZona = idZona;
	}

	public boolean isMostrarBar() {
		return mostrarBar;
	}

	public void setMostrarBar(boolean mostrarBar) {
		this.mostrarBar = mostrarBar;
	}

	public ProyCategoriaClienteBean getSelected() {
		return selected;
	}

	public void setSelected(ProyCategoriaClienteBean selected) {
		this.selected = selected;
	}

	public List<CategoriaClienteBean> getListaCanales() {
		return listaCanales;
	}

	public void setListaCanales(List<CategoriaClienteBean> listaCanales) {
		this.listaCanales = listaCanales;
	}

	public int getIdCanal() {
		return idCanal;
	}

	public void setIdCanal(int idCanal) {
		this.idCanal = idCanal;
	}
	
}
